/*
 * @Author: your name
 * @Date: 2021-02-24 23:16:54
 * @LastEditTime: 2021-02-25 00:30:27
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \webpack-loader-demo\src\babel-template.js
 */
const babel = require('@babel/core')
const template = require('@babel/template').default
const traverse = require('@babel/traverse').default;
const t = require('@babel/types')
const generate = require('@babel/generator').default


const code = `export default {
  name:1,
  created(a){
    console.log(123);
  },
}`
const code2 = `a-b`
const getNode = template.ast(code2)
// const props = getNode()
// console.log(props.expression.left,222)
// console.log(props.expression.right,111)
console.log(getNode,'ast');
console.log(template(code2)(),'ast2');
const parseAst = babel.parse(code)
const parseAst2 = babel.parse(code2)

// test()
function test() {
  traverse(parseAst,{
    ExportDefaultDeclaration(path){
      var msg1 = 'Date.now:'
      var msg2 = 'performance.timing.domLoading:'
      var time = t.binaryExpression(
        "-",
        t.callExpression(
          t.memberExpression(
            t.identifier('Date'),
            t.identifier('now'),
          ),[]
        ),
        t.memberExpression(
          t.memberExpression(
            t.memberExpression(t.identifier('window'),t.identifier('performance')),
            t.identifier('timing'),
          ),
          t.identifier('domLoading'),
        )
      )
      var template = t.templateLiteral([t.templateElement(
        {raw:msg1},
      ),t.templateElement(
        {raw:'bb'},
      ),t.templateElement(
        {raw:''},
      )],[t.identifier(msg1),t.identifier(msg2)])

      var newNode =
              t.objectMethod(
                'method',
                t.identifier('test'),
                [],
                t.blockStatement([
                  t.expressionStatement(
                    t.callExpression(
                      t.memberExpression(
                        t.identifier('console'),
                        t.identifier('log'),
                      ),[t.identifier(msg1),t.identifier(msg2),time,template]
                    ),
                    
                  )
                ])
              )
      path.get('declaration').unshiftContainer('properties', newNode)
      // console.log(path.get('declaration').get('properties').length,'push 后 2 ');
      // console.log(path.get('declaration').container,'container');
    }
  })
}

// traverse(parseAst,{
//   ExportDefaultDeclaration(path){
//     var newNode =
//       // t.objectProperty(
//       //   t.identifier('key'),
//       //     t.objectExpression([
//             t.objectMethod(
//               'method',
//               t.identifier('test'),
//               [],
//               t.blockStatement([
//                 t.expressionStatement(
//                   t.memberExpression(
//                     t.memberExpression(
//                       t.memberExpression(t.identifier('a'),t.identifier('b')),
//                       t.identifier('c'),
//                     ),
//                     t.identifier('d'),
//                 ))
//               ])
//             )
//           // ])
//         // )
//     path.get('declaration').unshiftContainer('properties', newNode)
//     // console.log(path.get('declaration').get('properties').length,'push 后 2 ');
//     // console.log(path.get('declaration').container,'container');
//   }
// })
// const output = generate(parseAst, {}, code)
// console.log(output);